home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok41
/
spiele
/
mastermind
/
txt
/
gadget.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
10KB
|
318 lines
(*********************************************************************
*
* :Program. HilfsModul für Mastermind
* :Author. Hans Schafft
* :Address. Landfriedstraße 1A - Hinterhaus
* :Address. 6900 Heidelberg
* :Phone. 06221 - 22416
* :Version. 1.3
* :Date. 6/1990
* :Copyright. PD
* :Language. Modula-II
* :Translator. M2Amiga
*
*********************************************************************)
IMPLEMENTATION MODULE Gadget;
FROM Abbruch IMPORT ZeigeAbbruch;
FROM VonWem IMPORT ShowReq;
FROM Hilfen IMPORT ZeigeHilfen;
FROM Arts IMPORT Terminate;
FROM SYSTEM IMPORT INLINE, ADDRESS, ADR, LONGSET;
FROM Graphics IMPORT ScrollRaster, SetAPen, RectFill,
Flood, Draw, Move, jam2, jam1;
FROM Exec IMPORT MemReqs, MemReqSet,AvailMem,WaitPort, ReplyMsg,
CopyMem, AllocMem, FreeMem, GetMsg;
FROM Intuition IMPORT GadgetPtr, ScreenPtr, keyCodeQ, selectDown,
IDCMPFlags, IDCMPFlagSet, PrintIText,
boolGadget, ActivationFlags,ActivationFlagSet,
Border, Gadget, GadgetFlagSet, IntuiText,
GadgetFlags, IntuiTextLength, gadgHighbits,
RefreshGadgets, AddGadget, DrawBorder, gadgHNone,
RemoveGadget,IntuiMessagePtr, WindowPtr;
VAR BoolGad : ARRAY [1..50] OF Gadget;
ZahlText : ARRAY [1..2] OF IntuiText;
text : ARRAY [0..16],[1..3] OF CHAR;
wiPtr : WindowPtr;
x,YPos : INTEGER;
sta : INTEGER;
rahmenWeite : INTEGER;
gadDim : ARRAY [1..30],[1..4] OF INTEGER;
(***************************************************************)
PROCEDURE GadgetsLoeschen;
VAR x,y : CARDINAL;
BEGIN
FOR x := 1 TO 30+sta DO
y := RemoveGadget(wiPtr,ADR(BoolGad[x]));
END;
END GadgetsLoeschen;
(***************************************************************)
PROCEDURE MaleBlock(y : INTEGER);
VAR x : INTEGER;
BEGIN
FOR x := 1 TO y DO
SetAPen(wiPtr^.rPort,x);
RectFill(wiPtr^.rPort,460,(x-1)*34 + 15,510,(x-1)*34 + 44);
END;
IF y < 14 THEN
FOR x := y+1 TO 14 DO
SetAPen(wiPtr^.rPort,0);
RectFill(wiPtr^.rPort,460,(x-1)*34 + 15,510,(x-1)*34 + 44);
END;
END;
END MaleBlock;
(***************************************************************)
PROCEDURE TextEinrichten(id,len : INTEGER);
VAR leer : IntuiText;
BEGIN
SetAPen(wiPtr^.rPort,5);
RectFill(wiPtr^.rPort,566,66+((id-1)*100),596,88+((id-1)*100));
WITH ZahlText[id] DO
leftEdge := gadDim[id,1]; topEdge := gadDim[id,2];
frontPen := 0; backPen := 5;
drawMode := jam2;
iText := ADR(text[len]);
iTextFont := NIL;
nextText := NIL;
END;
PrintIText(wiPtr^.rPort,ADR(ZahlText[id]),0,0);
END TextEinrichten;
(***************************************************************)
PROCEDURE InitGadget(le,te,wi,he,id : INTEGER);
VAR stelle : INTEGER;
BEGIN
WITH BoolGad[id] DO
leftEdge := le;
topEdge := te;
width := wi;
height := he;
flags := GadgetFlagSet{};
activation := ActivationFlagSet{gadgImmediate,relVerify};
gadgetType := boolGadget;
gadgetRender := NIL;
gadgetText := NIL;
mutualExclude:= LONGSET{};
nextGadget := NIL;
selectRender := NIL;
specialInfo := NIL;
userData := NIL;
gadgetID := id;
END;
IF ((id > 0) AND (id < 9)) OR (id > 16) THEN
BoolGad[id].flags := gadgHNone;
END;
stelle := AddGadget(wiPtr,ADR(BoolGad[id]),-1);
RefreshGadgets(ADR(BoolGad[id]),wiPtr,NIL);
END InitGadget;
(***************************************************************)
PROCEDURE FestGadgetAufbau(wPtr : WindowPtr);
VAR x : INTEGER;
BEGIN
wiPtr := wPtr;
gadDim[1,1]:=568;gadDim[1,2]:=72;gadDim[1,3]:=30;gadDim[1,4]:=25;
gadDim[2,1]:=568;gadDim[2,2]:=172;gadDim[2,3]:=30;gadDim[2,4]:=25;
gadDim[3,1]:=525;gadDim[3,2]:=55;gadDim[3,3]:=27;gadDim[3,4]:=34;
gadDim[4,1]:=610;gadDim[4,2]:=55;gadDim[4,3]:=27;gadDim[4,4]:=34;
gadDim[5,1]:=525;gadDim[5,2]:=152;gadDim[5,3]:=27;gadDim[5,4]:=34;
gadDim[6,1]:=610;gadDim[6,2]:=152;gadDim[6,3]:=27;gadDim[6,4]:=34;
gadDim[7,1]:=532;gadDim[7,2]:=16;gadDim[7,3]:=95;gadDim[7,4]:=25;
gadDim[8,1]:=532;gadDim[8,2]:=116;gadDim[8,3]:=95;gadDim[8,4]:=25;
gadDim[9,1]:=532;gadDim[9,2]:=226;gadDim[9,3]:=95;gadDim[9,4]:=25;
gadDim[10,1]:=532;gadDim[10,2]:=266;gadDim[10,3]:=95;gadDim[10,4]:=25;
gadDim[11,1]:=532;gadDim[11,2]:=306;gadDim[11,3]:=95;gadDim[11,4]:=25;
gadDim[12,1]:=532;gadDim[12,2]:=346;gadDim[12,3]:=95;gadDim[12,4]:=25;
gadDim[13,1]:=532;gadDim[13,2]:=386;gadDim[13,3]:=95;gadDim[13,4]:=25;
gadDim[14,1]:=532;gadDim[14,2]:=426;gadDim[14,3]:=95;gadDim[14,4]:=25;
gadDim[15,1]:=532;gadDim[15,2]:=471;gadDim[15,3]:=95;gadDim[15,4]:=25;
gadDim[16,1]:=412;gadDim[16,2]:=18;gadDim[16,3]:=26;gadDim[16,4]:=477;
(* Farbtafeln *)
FOR x := 17 TO 30 DO (* 14 mögliche Farben *)
gadDim[x,1] := 460; gadDim[x,2] := (x-17)*34 + 15;
gadDim[x,3] := 50; gadDim[x,4] := 33;
END;
FOR x := 1 TO 30 DO
InitGadget(gadDim[x,1],gadDim[x,2],gadDim[x,3],gadDim[x,4],x);
END;
TextEinrichten(1,8);
TextEinrichten(2,8);
END FestGadgetAufbau;
(***************************************************************)
PROCEDURE FlexGadgetAufbau(stellenAnzahl : INTEGER);
VAR gadNum : INTEGER;
rahmenXPos : ARRAY [31..45] OF INTEGER;
eckDaten : ARRAY [1..10] OF INTEGER;
rahmen : Border;
BEGIN
sta := stellenAnzahl;
rahmenWeite := 320 DIV stellenAnzahl;
YPos := rahmenWeite DIV 2;
FOR gadNum := 31 TO 30 + stellenAnzahl DO
rahmenXPos[gadNum] := (gadNum - 31) * rahmenWeite;
eckDaten[1] := rahmenXPos[gadNum] + 3;
eckDaten[2] := 3;
eckDaten[3] := rahmenXPos[gadNum] + rahmenWeite - 6;
eckDaten[4] := 3;
eckDaten[5] := rahmenXPos[gadNum] + rahmenWeite - 6;
eckDaten[6] := rahmenWeite - 6;
eckDaten[7] := rahmenXPos[gadNum] + 3;
eckDaten[8] := rahmenWeite - 6;
eckDaten[9] := rahmenXPos[gadNum] + 3;
eckDaten[10] := 3;
WITH rahmen DO
leftEdge := 0;
topEdge := 0;
frontPen := 14;
backPen := 4;
drawMode := jam1;
count := 5;
xy := ADR(eckDaten);
nextBorder := NIL;
END;
DrawBorder(wiPtr^.rPort,ADR(rahmen),0,0);
InitGadget(rahmenXPos[gadNum]+3,3,rahmenWeite-6,rahmenWeite-6,gadNum);
END;
END FlexGadgetAufbau;
(*******************************************************)
(* Ist ns = 15 wurde OK übergeben - alles war gelöst. *)
(* Ist fus = 16 wurde die Hilfe beansprucht *)
(*******************************************************)
PROCEDURE Auswerten(fus,ns : INTEGER);
VAR nsText,fusText : IntuiText;
i,x : INTEGER;
BEGIN
WITH fusText DO
leftEdge := 335; topEdge := YPos;
frontPen := 5; backPen := 0;
drawMode := jam2;
iText := ADR(text[fus]);
iTextFont := NIL;
nextText := NIL;
END;
IF fus = 16 THEN
fusText.iText := ADR("DAS WAR MIT HILFE !");
fusText.leftEdge := 20;
ELSIF fus = sta THEN
fusText.iText := ADR("ALLES RICHTIG");
fusText.leftEdge := 70;
END;
PrintIText(wiPtr^.rPort,ADR(fusText),0,0);
IF fus < 15 THEN
WITH nsText DO
leftEdge := 360; topEdge := YPos;
frontPen := 5; backPen := 0;
drawMode := jam2;
iText := ADR(text[ns]);
iTextFont := NIL;
nextText := NIL;
END;
PrintIText(wiPtr^.rPort,ADR(nsText),0,0);
END;
IF ns # 15 THEN
ScrollRaster(wiPtr^.rPort,0,-rahmenWeite,0,0,390,512);
FOR x := 31 TO 31+sta DO
i := RemoveGadget(wiPtr,ADR(BoolGad[x]));
END;
FlexGadgetAufbau(sta);
END;
END Auswerten;
(************************************************************************)
PROCEDURE StellenUndFarben(VAR stellenAnzahl,farbAnzahl : INTEGER);
VAR
gadPtr : GadgetPtr;
gadNr : INTEGER;
msgPtr : IntuiMessagePtr;
class : IDCMPFlagSet;
x, y : INTEGER;
code : CARDINAL;
fertig : BOOLEAN;
BEGIN
MaleBlock(8);
fertig := FALSE;
REPEAT
WaitPort(wiPtr^.userPort);
LOOP
msgPtr := GetMsg(wiPtr^.userPort);
IF msgPtr=NIL THEN EXIT END;
x := msgPtr^.mouseX;
y := msgPtr^.mouseY;
class := msgPtr^.class;
code := msgPtr^.code;
gadPtr := msgPtr^.iAddress;
gadNr := gadPtr^.gadgetID;
ReplyMsg(msgPtr);
IF (class = IDCMPFlagSet{gadgetUp}) THEN
CASE gadNr OF
| INTEGER(minusSt): IF stellenAnzahl > 4 THEN
DEC(stellenAnzahl);
TextEinrichten(1,stellenAnzahl);
END;
| INTEGER(plusSt): IF stellenAnzahl < 12 THEN
INC(stellenAnzahl);
TextEinrichten(1,stellenAnzahl);
END;
| INTEGER(minusFb): IF farbAnzahl > 2 THEN
DEC(farbAnzahl);
MaleBlock(farbAnzahl);
TextEinrichten(2,farbAnzahl);
END;
| INTEGER(plusFb): IF farbAnzahl < 14 THEN
INC(farbAnzahl);
TextEinrichten(2,farbAnzahl);
MaleBlock(farbAnzahl);
END;
| INTEGER(hilfe) : IF ZeigeHilfen(wiPtr) THEN END;
| INTEGER(spielen): fertig := TRUE;
| INTEGER(info) : ShowReq(wiPtr);
| INTEGER(ende) : IF ZeigeAbbruch(wiPtr) THEN
Terminate(0);
END;
ELSE
END;
END;
IF fertig THEN EXIT END;
END; (* LOOP *)
UNTIL fertig;
END StellenUndFarben;
(************************************************************************)
PROCEDURE TipFuellen(gadNum : INTEGER;farbReg : CARDINAL);
BEGIN
SetAPen(wiPtr^.rPort,farbReg);
RectFill(wiPtr^.rPort,BoolGad[gadNum].leftEdge+3,BoolGad[gadNum].topEdge+3,
BoolGad[gadNum].leftEdge+rahmenWeite-6,BoolGad[gadNum].topEdge+rahmenWeite-6);
END TipFuellen;
(************************************************************************)
(************************************************************************)
BEGIN
FOR x := 0 TO 15 DO
text[x,3] := 0C;
IF x < 10 THEN
text[x,1] := " ";
text[x,2] := CHAR(x+48);
ELSIF x < 15 THEN
text[x,1] := "1";
text[x,2] := CHAR(x+38);
END;
END;
END Gadget.